# Install modified versions of certain ANSI-incompatible system header files
# which are fixed to work correctly with ANSI C
# and placed in a directory that GNU C will search.
# See README-fixinc for more information.
# Directory where gcc sources (and sometimes special include files) live.
# fixincludes doesn't use this, but fixinc.svr4 does, and I want to make
# sure somebody doesn't try to use arg3 for something incompatible. -- gumby
SRCDIR=${3-${SRCDIR-.}}
# Directory containing the original header files.
# (This was named INCLUDES, but that conflicts with a name in Makefile.in.)
INPUT=${2-${INPUT-/usr/include}}
# Directory in which to store the results.
LIB=${1?"fixincludes: output directory not specified"}
# Define PWDCMD as a command to use to get the working dir
# in the form that we want.
PWDCMD=pwd
case "`pwd`" in
//*)
# On an Apollo, discard everything before `/usr'.
PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'"
;;
esac
# Original directory.
ORIGDIR=`${PWDCMD}`
# Make sure it exists.
if [ ! -d $LIB ]; then
mkdir $LIB || exit 1
fi
# Make LIB absolute only if needed to avoid problems with the amd.
case $LIB in
/*)
;;
*)
cd $LIB; LIB=`${PWDCMD}`
;;
esac
# Make SRCDIR absolute only if needed to avoid problems with the amd.
cd $ORIGDIR
case $SRCDIR in
/*)
;;
*)
cd $SRCDIR; SRCDIR=`${PWDCMD}`
;;
esac
# Fail if no arg to specify a directory for the output.
if [ x$1 = x ]
then echo fixincludes: no output directory specified
exit 1
fi
echo Building fixed headers in ${LIB}
# Determine whether this system has symbolic links.
if ln -s X $LIB/ShouldNotExist 2>/dev/null; then
rm -f $LIB/ShouldNotExist
LINKS=true
else
LINKS=false
fi
echo Finding directories and links to directories
cd ${INPUT}
# Find all directories and all symlinks that point to directories.
# Put the list in $files.
# Each time we find a symlink, add it to newdirs
# so that we do another find within the dir the link points to.
# Note that $files may have duplicates in it;
# later parts of this file are supposed to ignore them.
dirs="."
levels=2
while [ -n "$dirs" ] && [ $levels -gt 0 ]
do
levels=`expr $levels - 1`
newdirs=
for d in $dirs
do
echo " Searching $INPUT/$d"
if [ "$d" != . ]
then
d=$d/.
fi
# Find all directories under $d, relative to $d, excluding $d itself.
files="$files `find $d -type d -print | \
sed -e '/\/\.$/d' -e '/^\.$/d'`"
# Find all links to directories.
# Using `-exec test -d' in find fails on some systems,
# and trying to run test via sh fails on others,
# so this is the simplest alternative left.
# First find all the links, then test each one.
theselinks=
$LINKS && \
theselinks=`find $d -type l -print`
for d1 in $theselinks --dummy--
do
# If the link points to a directory,
# add that dir to $newdirs
if [ -d $d1 ]
then
newdirs="$newdirs $d1"
fi
done
done
files="$files $newdirs"
dirs="$newdirs"
done
dirs=
echo "All directories (including links to directories):"
echo $files
for file in $files; do
rm -rf $LIB/$file
if [ ! -d $LIB/$file ]
then mkdir $LIB/$file
fi
done
mkdir $LIB/root
# treetops gets an alternating list
# of old directories to copy
# and the new directories to copy to.
treetops="${INPUT} ${LIB}"
if $LINKS; then
echo 'Making symbolic directory links'
for file in $files; do
dest=`ls -ld $file | sed -n 's/.*-> //p'`
if [ "$dest" ]; then
cwd=`${PWDCMD}`
# In case $dest is relative, get to $file's dir first.
cd ${INPUT}
cd `echo ./$file | sed -n 's&[^/]*$&&p'`
# Check that the target directory exists.
# Redirections changed to avoid bug in sh on Ultrix.
(cd $dest) > /dev/null 2>&1
if [ $? = 0 ]; then
cd $dest
# X gets the dir that the link actually leads to.
x=`${PWDCMD}`
# If a link points to ., make a similar link to .
if [ $x = $INPUT ]; then
echo $file '->' . ': Making link'
rm -fr ${LIB}/$file > /dev/null 2>&1
ln -s . ${LIB}/$file > /dev/null 2>&1
# If link leads back into ${INPUT},
# make a similar link here.
elif expr $x : "${INPUT}/.*" > /dev/null; then
# Y gets the actual target dir name, relative to ${INPUT}.
y=`echo $x | sed -n "s&${INPUT}/&&p"`
echo $file '->' $y ': Making link'
rm -fr ${LIB}/$file > /dev/null 2>&1
ln -s ${LIB}/$y ${LIB}/$file > /dev/null 2>&1
else
# If the link is to a dir $target outside ${INPUT},
# repoint the link at ${INPUT}/root$target
# and process $target into ${INPUT}/root$target
# treat this directory as if it actually contained the files.
echo $file '->' root$x ': Making link'
if [ -d $LIB/root$x ]
then true
else
dirname=root$x/
dirmade=.
cd $LIB
while [ x$dirname != x ]; do
component=`echo $dirname | sed -e 's|/.*$||'`
mkdir $component >/dev/null 2>&1
cd $component
dirmade=$dirmade/$component
dirname=`echo $dirname | sed -e 's|[^/]*/||'`
done
fi
# Duplicate directory structure created in ${LIB}/$file in new
# root area.
for file2 in $files; do
case $file2 in
$file/./*)
dupdir=${LIB}/root$x/`echo $file2 | sed -n "s|^${file}/||p"`
echo "Duplicating ${file}'s ${dupdir}"
if [ -d ${dupdir} ]
then true
else
mkdir ${dupdir}
fi
;;
*)
;;
esac
done
rm -fr ${LIB}/$file > /dev/null 2>&1
ln -s ${LIB}/root$x ${LIB}/$file > /dev/null 2>&1
treetops="$treetops $x ${LIB}/root$x"
fi
fi
cd $cwd
fi
done
fi
set x $treetops
shift
while [ $# != 0 ]; do
# $1 is an old directory to copy, and $2 is the new directory to copy to.
cd ${INPUT}
cd $1
# The same dir can appear more than once in treetops.
# There's no need to scan it more than once.
if [ -f $2/DONE ]
then
files=
else
touch $2/DONE
echo Fixing directory $1 into $2
# Check .h files which are symlinks as well as those which are files.
# A link to a header file will not be processed by anything but this.
if $LINKS; then
files=`find . -name '*.h' \( -type f -o -type l \) -print`
else
files=`find . -name '*.h' -type f -print`
fi
echo Checking header files
fi
# Note that BSD43_*,SYSTYPE_*,MIPSE[LB] are used on recent MIPS systems.
for file in $files; do
# This call to egrep is essential, since checking a file with egrep
# is much faster than actually trying to fix it.
# It is also essential that most files *not* match!
# Thus, matching every #endif is unacceptable.
# But the argument to egrep must be kept small, or many versions of egrep
# won't be able to handle it.
#
# We use the pattern [!-.0-~] instead of [^/ ] to match a noncomment
# following #else or #endif because some buggy egreps think [^/] matches
# newline, and they thus think `#else ' matches `#e[ndiflse]*[ ]+[^/ ]'.
#
# We use the pattern [^a-zA-Z0-9_][_a-ce-km-z][a-z0-9] to match an identifier
# following #if or #elif that is not surrounded by __. The `a-ce-km-z'
# in this pattern lacks `d' and `l'; this means we don't worry about
# identifiers starting with `d' or `l'. This is OK, since none of the
# identifiers below start with `d' or `l'. It also greatly improves
# performance, since many files contain lines of the form `#if ... defined ...'
# or `#if lint'.
if egrep '//|[ _]_IO|CTRL|SYSTYPE|MIPSE|^#define.NULL|^#e[nl][ds][ief]*[ ]+[!-.0-~]|^#[el]*if.*[^a-zA-Z0-9_][_a-ce-km-z][a-z0-9]' $file >/dev/null; then
if [ -r $file ]; then
cp $file $2/$file >/dev/null 2>&1 \
|| echo "Can't copy $file"
chmod +w $2/$file
chmod a+r $2/$file
# Here is how the sed commands in braces work.
# (It doesn't work to put the comments inside the sed commands.)
# Surround each word with spaces, to simplify matching below.
# ANSIfy each pre-ANSI machine-dependent symbol
# by surrounding it with __ __.
# Remove the spaces that we inserted around each word.